package com.weightx.weight.utils;

import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;

public class DateUtils {

    private static final ThreadLocal<SimpleDateFormat> threadLocalSdf = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
    private static final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    /**
     * 将 Date 对象格式化为字符串
     *
     * @param date   Date 对象
     * @param format 日期格式，例如 "yyyy-MM-dd HH:mm:ss"
     * @return 格式化后的字符串
     */
    public static String formatDate(Date date, String format) {
        SimpleDateFormat sdf = threadLocalSdf.get(); // 获取线程局部变量
        sdf.applyPattern(format); // 设置日期格式
        return sdf.format(date); // 将 Date 转换为字符串
    }

    /**
     * 将 LocalDateTime 对象格式化为字符串
     *
     * @param dateTime LocalDateTime 对象
     * @param format   日期格式，例如 "yyyy-MM-dd HH:mm:ss"
     * @return 格式化后的字符串
     */
    public static String formatDateTime(LocalDateTime dateTime, String format) {
        return dateTime.format(DateTimeFormatter.ofPattern(format));
    }

    /**
     * 将 Date 对象格式化为默认格式的字符串（"yyyy-MM-dd HH:mm:ss"）
     *
     * @param date Date 对象
     * @return 格式化后的字符串
     */
    public static String formatDate(Date date) {
        return formatDate(date, "yyyy-MM-dd");
    }

    public static String formatDateTime(Date date) {
        return formatDate(date, "yyyy-MM-dd HH:mm:ss");
    }

    public static String formatYear(Date date) {
        return formatDate(date, "yyyy");
    }

    /**
     * 将 LocalDateTime 对象格式化为默认格式的字符串（"yyyy-MM-dd HH:mm:ss"）
     *
     * @param dateTime LocalDateTime 对象
     * @return 格式化后的字符串
     */
    public static String formatDateTime(LocalDateTime dateTime) {
        return formatDateTime(dateTime, "yyyy-MM-dd HH:mm:ss");
    }

    /**
     * @param before
     * @param y
     * @return
     */
    public static Date getDateBefore(Date date, int before) {
        // Set up a calendar object and subtract the appropriate number of days from the current date
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.DAY_OF_MONTH, -before);
        Date xDaysAgo = calendar.getTime();

        // Truncate the start date to the beginning of the day

        return org.apache.commons.lang3.time.DateUtils.truncate(org.apache.commons.lang3.time.DateUtils.addDays(xDaysAgo, 1), Calendar.DAY_OF_MONTH);
    }

}
